게시판에서 조회수는 사용자가 해당 게시글을 읽어보게 하는 하나의 지표가 될 수 있다고 생각한다.
그러한 기능을 단지 게시글에 접속하는것만으로 무한정 올릴 수 있다면, 그 지표의 역할이 사라진다고 본다.
그렇기에 내가 만드는 게시판에는 조회수 중복을 방지하도록 하였다.
구현먼저 간단하게 Cookie의 개념을 집고 넘어가는 것이 좋다.
Cookie란 HTTP 통신 과정에서 브라우저에 저장되는 작은 데이터 조각이라 할 수 있다.
[Network] 간단히 알아보는 Cookie, Session
Cookie에 대해서는 위의 글에 간단히 정리해 두었다.
BoardMapper.xml
UPDATE hellparty_boardSET viewCount = viewCount + 1WHERE boardIdx = #{boardIdx}BoardController
@GetMapping(value = "/detail")public String detailGET(@RequestParam(name = "boardIdx") int boardIdx, @SessionAttribute(name = "loginUser", required = false)UserDTO loginUser, HttpServletRequest request, HttpServletResponse response, Model model) {log.info("Controller detailGET");BoardDTO boardDTO = boardService.boardDetail(boardIdx);model.addAttribute("loginUser", loginUser);model.addAttribute("boardDTO", boardDTO);/* 조회수 로직 */Cookie[] cookies = request.getCookies();if (cookies != null) {for (Cookie cookie : cookies) {log.info("cookie.getName " + cookie.getName());log.info("cookie.getValue " + cookie.getValue());if (!cookie.getValue().contains(request.getParameter("boardIdx"))) {cookie.setValue(cookie.getValue() + "_" + request.getParameter("boardIdx"));cookie.setMaxAge(60 * 60 * 2); /* 쿠키 시간 */response.addCookie(cookie);boardService.boardViewCount(boardIdx);}}} else {Cookie newCookie = new Cookie("visit_cookie", request.getParameter("boardIdx"));newCookie.setMaxAge(60 * 60 * 2);response.addCookie(newCookie);boardService.boardViewCount(boardIdx);}return "/board/detail";위의 로직을 보면
1. reqeust를 통해 쿠키를 가져온다.1-1. 만약 쿠키가 존재하지 않다면 새로운 visit_cookie라는 이름의 쿠키를 생성하고 추가해준 후 조회수를 증가시킨다.2. 가져온 쿠키의 value에 해당 boardIdx값이 존재 하지 않다면 추가시켜준 후, 조회수를 증가시켜 준다.개발자 도구를 통해 확인해 보면 visit_cookie 라는 이름의 쿠키에 value는 boardIdx 값인 1이 들어가 있는것을 볼 수 있다.
쿠키 값이 이상하게 꼬여서 안된 경우가 생겼지만, 그 경우 문제되는 쿠키를 삭제하고 새로고침만 해줘도 해결되었고, 그 뒤 그런 경우는 생기지 않았다.
참고 블로그https://mighty96.github.io/til/view/https://ondolroom.tistory.com/446